package com.sojson.util.async.interfaces;

import static com.sojson.util.async.PageHandleUtil.IS_PAGE;
import static com.sojson.util.async.PageHandleUtil.ORDER_BY_COLUMN_DEFAULT;
import static com.sojson.util.async.PageHandleUtil.PAGE_NUM_ALL;
import static com.sojson.util.async.PageHandleUtil.PAGE_NUM_DEFAULT;
import static com.sojson.util.async.PageHandleUtil.PAGE_SIZE_DEFAULT;

import java.util.List;

import com.github.pagehelper.Page;
import com.sojson.base.impl.BaseUtilDto;
import com.sojson.util.StringUtil;
import com.sojson.util.async.PageHandleUtil;

/**
 * 分页处理器抽象类
 * 
 * @author liu
 * @date 2021-08-15
 */
public abstract class PageHandle<T> extends BaseUtilDto {

    /***/
    private static final long serialVersionUID = 1L;

    /** 第几页 */
    private Integer pageNum;
    /** 每页显示记录数 */
    private Integer pageSize;
    /** 总页数 */
    private Integer pageTotal;
    /** 排序字段 */
    private String orderByColumn;
    /** 执行次数 */
    private Integer runNum;
    /** 是否分页 */
    private Boolean isPage;

    /**
     * 构造方法
     */
    public PageHandle() {
        this(ORDER_BY_COLUMN_DEFAULT, IS_PAGE);
    }

    /**
     * 构造方法
     * 
     * @param orderByColumn 查询数据的排序字段
     */
    public PageHandle(String orderByColumn) {
        this(orderByColumn, IS_PAGE);
    }

    /**
     * 构造方法
     * 
     * @param isPage    数据是否分页查询
     */
    public PageHandle(Boolean isPage) {
        this(ORDER_BY_COLUMN_DEFAULT, isPage);
    }

    /**
     * 构造方法
     * 
     * @param orderByColumn 查询数据的排序字段
     * @param isPage        数据是否分页查询
     */
    public PageHandle(String orderByColumn, Boolean isPage) {
        // 设置排序规则
        setOrderByColumn(orderByColumn);
        setIsPage(isPage);

        // 如果是分页对象就初始化分页数据
        if (isPage) {
            setPageNum(PAGE_NUM_DEFAULT);
            setPageSize(PAGE_SIZE_DEFAULT);
            return;
        }

        // 设置不分页
        setPageNum(PageHandleUtil.PAGE_NUM_ALL);
        setPageSize(PageHandleUtil.PAGE_SIZE_ALL);
        setRunNum(1);
    }

    /**
     * 构造方法
     * 
     * @param pageNum   第几页
     * @param pageSize  每页显示记录数
     */
    public PageHandle(Integer pageNum, Integer pageSize) {
        this(pageNum, pageSize, ORDER_BY_COLUMN_DEFAULT);
    }

    /**
     * 构造方法
     * 
     * @param pageNum       第几页
     * @param pageSize      每页显示记录数
     * @param orderByColumn 查询数据的排序字段
     */
    public PageHandle(Integer pageNum, Integer pageSize, String orderByColumn) {
        // 设置排序规则
        setOrderByColumn(orderByColumn);
        setPageNum(pageNum);
        setPageSize(pageSize);
        if (getPageNum() == PAGE_NUM_ALL || getPageSize() == PAGE_NUM_ALL) {
            setRunNum(1);
            setIsPage(false);
        } else {
            setIsPage(true);
        }
    }

    /**
     * 构造方法
     * 
     * @param list      数据
     */
    public PageHandle(List<T> list) {
        this(list, ORDER_BY_COLUMN_DEFAULT);
    }

    /**
     * 构造方法
     * 
     * @param list          数据
     * @param orderByColumn 查询数据的排序字段
     */
    public PageHandle(List<T> list, String orderByColumn) {
        // 设置排序规则
        setOrderByColumn(orderByColumn);

        // 如果是分页对象就初始化分页数据
        if (list instanceof Page<?>) {
            Page<?> page = (Page<?>)list;
            setPageNum(
                page.getPageNum() != PageHandleUtil.PAGE_NUM_ALL ? page.getPageNum() : PageHandleUtil.PAGE_NUM_DEFAULT);
            setPageSize(page.getPageSize() != PageHandleUtil.PAGE_SIZE_ALL ? page.getPageSize()
                : PageHandleUtil.PAGE_SIZE_DEFAULT);
            setPageTotal(page.getPages());
            setRunNum(getPageTotal());
            setIsPage(true);
            return;
        }

        // 设置不分页
        setPageNum(PageHandleUtil.PAGE_NUM_ALL);
        setPageSize(PageHandleUtil.PAGE_SIZE_ALL);
        setRunNum(1);
        setIsPage(false);
    }

    /**
     * 初始化分页参数(默认获取下一页数据,如果当前页为最后一页则将当前页设为-1)
     * 
     * @param list
     */
    public void init(List<T> list) {
        // 如果是分页对象就初始化分页数据
        if (getIsPage()) {
            Page<?> page = (Page<?>)list;
            if (StringUtil.isBlankObject(getPageNum())) {
                setPageNum(page.getPageNum() != PageHandleUtil.PAGE_NUM_ALL ? page.getPageNum()
                    : PageHandleUtil.PAGE_NUM_DEFAULT);
            }
            if (StringUtil.isBlankObject(getPageSize())) {
                setPageSize(page.getPageSize() != PageHandleUtil.PAGE_SIZE_ALL ? page.getPageSize()
                    : PageHandleUtil.PAGE_SIZE_DEFAULT);
            }
            setPageTotal(page.getPages());
            if (StringUtil.isBlankObject(getRunNum())) {
                setRunNum(getPageTotal());
            }
            return;
        }

        // 设置不分页
        if (StringUtil.isBlankObject(getPageNum())) {
            setPageNum(PageHandleUtil.PAGE_NUM_ALL);
        }
        if (StringUtil.isBlankObject(getPageSize())) {
            setPageSize(PageHandleUtil.PAGE_SIZE_ALL);
        }
        if (StringUtil.isBlankObject(getRunNum())) {
            setRunNum(1);
        }
    }

    /**
     * 修改分页参数(默认获取下一页数据,如果当前页为最后一页则将当前页设为-1)
     * 
     * @param list
     */
    public abstract void update(List<T> list);

    /** 获取 第几页 */
    public Integer getPageNum() {
        return pageNum;
    }

    /** 设置 第几页 */
    public void setPageNum(Integer pageNum) {
        this.pageNum = pageNum;
    }

    /** 获取 每页显示记录数 */
    public Integer getPageSize() {
        return pageSize;
    }

    /** 设置 每页显示记录数 */
    public void setPageSize(Integer pageSize) {
        this.pageSize = pageSize;
    }

    /** 获取 总页数 */
    public Integer getPageTotal() {
        return pageTotal;
    }

    /** 设置 总页数 */
    public void setPageTotal(Integer pageTotal) {
        this.pageTotal = pageTotal;
    }

    /** 获取 排序字段 */
    public String getOrderByColumn() {
        return orderByColumn;
    }

    /** 设置 排序字段 */
    public void setOrderByColumn(String orderByColumn) {
        this.orderByColumn = orderByColumn;
    }

    /** 获取 执行次数 */
    public Integer getRunNum() {
        return runNum;
    }

    /** 设置 执行次数 */
    public void setRunNum(Integer runNum) {
        this.runNum = runNum;
    }

    /** 获取 是否分页 */
    public Boolean getIsPage() {
        return isPage;
    }

    /** 设置 是否分页 */
    public void setIsPage(Boolean isPage) {
        this.isPage = isPage;
    }

}